package com.iking.housekeeping.service.dept;

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iking.housekeeping.dao.dept.SysDeptMapper;
import com.iking.housekeeping.entity.dept.SysDept;
import com.iking.housekeeping.httpbean.dept.reqbean.ReturnSysDept;
import com.iking.housekeeping.httpbean.dept.resbean.DeptDetail;

/**
 * 组织架构管理Service
 * 
 * @author 秦甫杰
 *
 */
@Service
public class DeptService {

	@Autowired
	private SysDeptMapper sysDeptMapper;

	/**
	 * 添加父级部门
	 * 
	 * @return
	 */
	public int addFatherDept(SysDept sysDept) {
		return sysDeptMapper.insertSelective(sysDept);
	}

	/**
	 * 将部门列表转换为树结构
	 * 
	 * @param sysDeptList
	 * @param fPCode
	 * @return
	 */
	public List<ReturnSysDept> getDeptTree(List<ReturnSysDept> sysDeptList, String fPCode) {
		List<ReturnSysDept> returnSysDeptList = new ArrayList<ReturnSysDept>();
		// 遍历所有部门
		for (ReturnSysDept sysDept : sysDeptList) {
			// 如果此部门的父级code等于传入的父级code
			if (sysDept.getfDeptPCode().equals(fPCode)) {
				// 将此加入到returnSysMenuList
				returnSysDeptList.add(sysDept);
				// 再次循环此方法并设置为子菜单
				sysDept.setChildren(getDeptTree(sysDeptList, sysDept.getfDeptCode()));
			}
		}
		return returnSysDeptList;
	}

	/**
	 * 查询所有父级部门
	 * 
	 * @param PCode
	 * @return
	 */
	public List<SysDept> sysDeptList(String pCode) {
		return sysDeptMapper.selectSysDeptByPCode(pCode);
	}

	/**
	 * 根据名字查看部门
	 * 
	 * @param name
	 * @return
	 */
	public SysDept selectSysDeptByDName(String name) {
		return sysDeptMapper.selectSysDeptByDName(name);
	}

	/**
	 * 根据id删除部门
	 * 
	 * @param fId
	 * @return
	 */
	public int deleteDeptById(String fId) {
		return sysDeptMapper.deleteByPrimaryKey(fId);
	}

	/**
	 * 根据id查询部门
	 * 
	 * @param fId
	 * @return
	 */
	public SysDept selectDeptById(String fId) {
		return sysDeptMapper.selectByPrimaryKey(fId);
	}

	/**
	 * 
	 */
	public void changeDeptCode(SysDept sysDept, String newfDeptCode) {
		// 原父级部门编号
		String oldfDeptCode = sysDept.getfDeptCode();
		// 更改子部门的编号fMenuCode
		sysDept.setfDeptCode(newfDeptCode);
		// 更新当前部门的编号
		sysDeptMapper.updateByPrimaryKeySelective(sysDept);
		// 根据原编号获取当下所有子部门
		List<SysDept> deptChildren = sysDeptMapper.selectSysDeptByPCode(oldfDeptCode);
		// 循环更改子部门编号
		for (SysDept children : deptChildren) {
			// 更改子级编号中的父级编号
			children.setfDeptPCode(newfDeptCode);
			// 递归更改子部门编号
			changeDeptCode(children, newfDeptCode + children.getfDeptCode()
					.substring(children.getfDeptCode().length() - 2, children.getfDeptCode().length()));
		}
	}

	/**
	 * 部门排序
	 * 
	 * @param menuList
	 */
	public void soltSysMenuList(List<SysDept> deptList) {
		// 定义一个当前的菜单号
		String fDeptCode;
		// 定义一个新的菜单号
		String newfDeptCode;
		// 遍历所有的父节长度
		for (int i = 0; i < deptList.size(); i++) {
			// 获取当前菜单编号
			fDeptCode = deptList.get(i).getfDeptCode();
			// 正常菜单编号应为i+1,满足则跳过
			if (i + 1 == Integer.parseInt(fDeptCode.substring(fDeptCode.length() - 2, fDeptCode.length()))) {
				continue;
			}
			// 如果序号>=10,则倒数第二位补0
			if (i + 1 < 10) {
				newfDeptCode = fDeptCode.substring(0, fDeptCode.length() - 2) + '0' + (i + 1);
			} else {
				newfDeptCode = fDeptCode.substring(0, fDeptCode.length() - 2) + (i + 1);
			}
			// 更改菜单编号
			changeDeptCode(deptList.get(i), newfDeptCode);
		}
	}

	/**
	 * 更新用户
	 * 
	 * @param sysDept
	 * @return
	 */
	public int updateDept(SysDept sysDept) {
		return sysDeptMapper.updateByPrimaryKeySelective(sysDept);
	}

	/**
	 * 通过code进行模糊查询
	 * 
	 * @param code
	 * @return
	 */
	public List<SysDept> selectListDeptByCode(String code) {
		return sysDeptMapper.selectListDeptByCode(code);
	}

	/**
	 * 查询所有的部门
	 * 
	 * @return
	 */
	public List<ReturnSysDept> selectAllSysDept() {
		return sysDeptMapper.selectAll();
	}

	/**
	 * 查询所有部门
	 */
	public List<SysDept> selectAll() {
		return sysDeptMapper.selectList();
	}

	/**
	 * 根据部门ID查询部门详情
	 * 
	 * @param fId
	 * @return
	 */
	public DeptDetail selectDeptDetailById(String fId) {
		return sysDeptMapper.selectDeptDetailById(fId);
	}

	/**
	 * 根据id判断用户是否为区域管理员
	 * @param fid
	 * @return
	 */
	public List<SysDept> selectAdminById(String fid){
		return sysDeptMapper.selectAdminById(fid);
	}
	/**
	 * 根据id判断用户是否为区域管理员
	 *
	 * @return
	 */
	public List<SysDept> selectdepCod(String fId){
		return sysDeptMapper.selectdepCod(fId);
	}
	/**
	 * 根据管理员ID修改
	 * 
	 * @param delUser
	 * @return
	 */
	public int selectByAdmin(List<String> userIdList) {
		return sysDeptMapper.upDateByAdmin(userIdList);
	}

}
